package tec;

class Autobus 
    implements Bus, Transport {
    
    
    private final JaugeNaturel nbAssis;
    private final JaugeNaturel nbDebout;
    private int arret;
    private final Passager[] passagers;
    
	
    public Autobus(int nbPlaceAssise, int nbPlaceDebout) {
	passagers = new Passager[nbPlaceAssise + nbPlaceDebout];
	nbAssis =  new JaugeNaturel(0,nbPlaceAssise,0);
	nbDebout = new JaugeNaturel(0,nbPlaceDebout,0);
	arret = 1;

    }
    

  public boolean aPlaceAssise() {
      
      return !(nbAssis.estRouge());
  }

  public boolean aPlaceDebout() {
      return !(nbDebout.estRouge());
  }

  public void demanderPlaceAssise(Passager p) {
      nbAssis.incrementer();
      passagers[chercherVide()] = p;
      p.accepterPlaceAssise();
      
  }

  public  void demanderPlaceDebout(Passager p) {
      nbDebout.incrementer();
      passagers[chercherVide()] = p;
      p.accepterPlaceDebout();
      
  }

  public  void demanderSortie(Passager p) {
      if(p.estAssis()){
	  nbAssis.decrementer();
	  p.accepterSortie();
      }
      else{
	  if(p.estDebout()){
	      nbDebout.decrementer();
	      p.accepterSortie();
	  }
      }
      passagers[chercherPassager(p)] = null;
  }
    
    //les parametres sont consideres valides
  public   void demanderChangerEnDebout(Passager p) {
	nbAssis.decrementer();
	nbDebout.incrementer();
	p.accepterPlaceDebout();
    }
    
  public   void demanderChangerEnAssis(Passager p) {
	nbAssis.incrementer();
	nbDebout.decrementer();
	p.accepterPlaceAssise();
	
    }

    public void allerArretSuivant() { 
	arret++;
	for(int i=0; i < passagers.length; i++){
	    if(null != passagers[i])
		passagers[i].nouvelArret(this, arret);
	    
	}
    }

    private int chercherVide(){

	int i;
	for(i=0; i< passagers.length; i++){
	    if(passagers[i] == null)
		return i;
	}
	return i;
    }
    

    private int chercherPassager(Passager passager){
	int i;
	for(i=0; i<passagers.length; i++){
	    if(passagers[i] == passager)
		return i;
	}
	return i;
    }

    
    
    @Override
    public String toString() {
	
	return "[arret:" + arret + ", assis:" + nbAssis.toString() + ", debout:" + nbDebout.toString() + "]";
    }
    
}
